// 举例
function sum(num1: number, num2: number) {
}
// 对于上面的函数sum 两个参数的类型是固定的，但是在很多情况下，我们并不能将类型写死，这样不方便于我们对这个函数的扩展


// 泛型： 类型的参数化
// 在定义函数的时候，我不决定这些参数的类型
// 而是让调用者以参数的形式告知，我们这里的函数应该是什么类型
function foo<T>(num1: T, num2: T) {

}
// 调用方式1: 明确的传入类型
foo<number>(10, 20)
foo<{ name: string }>({ name: 'cht' }, { name: 'hw' })
foo<any[]>([1, 2], [3, 4])

// 调用方式二: 类型推导=> 自动推导类型
foo(1, 2)
foo([1, 2], [3, 4])
foo('cht', 'hw')


export { }